package co.edu.udea.xyz.dao.hibernate;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import co.edu.udea.xyz.dao.SucursalDAO;
import co.edu.udea.xyz.dto.Cliente;
import co.edu.udea.xyz.dto.Solicitud;
import co.edu.udea.xyz.dto.Sucursal;
import co.edu.udea.xyz.util.exception.XYZException;

/**
 * Clase SucursalDAOHibernate 
 * Hereda HibernateDaoSupport
 * Implementa SucursalDAO
 * 
 * Contiene los metodos para el manejo de las Personas.
 * @author CesarGuapacha
 *
 */
public class SucursalDAOHibernate extends HibernateDaoSupport implements
		SucursalDAO {

	public SucursalDAOHibernate() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * Metodo que obtiene una lista de Sucursales
	 * que contiene la tabla SUCURSALES de la Base de Datos.
	 */
	@Override
	public List<Sucursal> obtener() throws XYZException {
		Session session = null;
		List<Sucursal> sucursal = new ArrayList<Sucursal>();
		
		try{
			session = getSession();
			Criteria criteria = session.createCriteria(Sucursal.class);
			sucursal = criteria.list();
		}catch(HibernateException e){
			throw new 	XYZException(e);
		}
		return sucursal;
	}

	/**
	 * Metodo Obtener sucursal segun su idSucursal.
	 * @param idSucursal de la sucursal
	 * @return sucursal
	 */
	@Override
	public Sucursal obtener(int idSucursal) throws XYZException {
		Session session = null;
		Sucursal sucursal = null;
		
		try{
			session = getSession();
			sucursal = (Sucursal)session.get(Sucursal.class, idSucursal);
		}catch(HibernateException e){
			throw new XYZException(e);
		}
		return sucursal;
	}

	/**
	 * Metodo que guarda una sucursal en la base de datos
	 * @param Sucursal
	 */
	@Override
	public void guardar(Sucursal sucursal) throws XYZException {
		Session session = null;
		Transaction tx = null;
		
		try{
			session = getSession();
			tx = session.beginTransaction();
			session.save(sucursal);
			
		}catch(HibernateException e){
			throw new XYZException(e);
		}

	}

	/**
	 * Metodo que actualiza una sucursal en la base de datos
	 * @param Sucursal
	 */
	@Override
	public void actualizar(Sucursal sucursal) throws XYZException {
		Session session = null;
		Transaction tx = null;
		
		try{
			session = getSession();
			tx = session.beginTransaction();
			session.update(sucursal);
						
		}catch(HibernateException e){
			throw new XYZException(e);
		}

	}
	
	@Override
	public List<Solicitud> getSolicitudesSucursal(Sucursal sucursal)throws XYZException{
		Session session = null;
		List<Solicitud> solicitudes = new ArrayList<Solicitud>();
		try{
			session = getSession();
			
			Criteria criteria = session.createCriteria(Solicitud.class);
			
			criteria = criteria.add((Restrictions.eq("sucursal", sucursal.getIdSucursal())));
						
			solicitudes = criteria.list();
			
	}catch(HibernateException e){
		throw new XYZException(e);
	}
	return solicitudes;	
	}
	
	

}
